昨天介紹完打擊,今天接下來介紹投球,不過其實大多數的參數都滿像的,但投手的 methods 多打者滿多的,一起來瞧瞧吧。
跟昨天的 statcast_batter
是用同一個頁面的搜尋,所以參數跟回傳的欄位都會一樣。不過 官方文件 有另外提到一個 issue,是假設搜尋的範圍有超過 30000 顆球,最多也只能獲得 30000 顆球的資料。
另外我發現他假設搜不到投球資料會回傳錯誤,而不是跟 statcast_batter
一樣會回傳空的 DataFrame
,所以在操作的時候可能要注意一下,如果只想取得當天投球資料要很確定日期是正確的。
start_dt
:搜尋的開始日期,需符合 YYYY-MM-DD
的字串格式,預設會是昨天,如果只填開始日期會只有填入當天的資料。end_dt
:搜尋的結束日期,需符合 YYYY-MM-DD
的字串格式,預設是 None
,如果要找一天以上的資料一定要填結束日期。player_id
:球員的 mlbam ID,需為整數,為必填,沒填入數字會出現錯誤,也可以去 Savant 的球員個人頁的 URL 得知球員的 mlbam ID。例如 Kershaw 的 https://baseballsavant.mlb.com/savant-player/clayton-kershaw-477132,ID 就會是最後面那個數字,477132。範例:
from pybaseball import statcast_pitcher
# 獲得大谷翔平(mlbam=660271)2023-03-30 到 2023-09-20 的投球數據
data = statcast_pitcher(start_dt="2023-03-31", end_dt="2023-09-20", player_id=660271)
# 獲得大谷翔平昨天的數據,因為他沒上場所以應該要是空的,但這次會回傳錯誤
# statcast_pitcher(player_id=660271)
跟 statcast_batter_exitvelo_barrels
使用同一個頁面獲得打擊初速相關資料,所以參數跟回傳欄位會一樣,不過改顯示成投手被擊出的打擊初速相關數據。另外一個不一樣的地方是最小 BBE 的計算,如果是預設 Qualified 的話會是 1.25 個打席數 * 球隊出賽數而不是 2.1 個打席數來計算。然後再補充一個我昨天的解釋錯誤,他雖然是寫 minBBE
,但他 Qualified 的還是是看打席數決定,而不是 BBE。
year
:查詢的球季,必填,需為整數。minBBE
:最小 Batted Ball Event (BBE),如果是預設值會是 Qualified,會看最小打席數是否超過 1.25 個打席數 * 球隊出賽數。如果是選其他選項就會把超過的 BBE 投手篩掉。例如:minBBE=100
就會篩出至少 BBE 100 以上的投手。from pybaseball import statcast_pitcher_exitvelo_barrels
# 獲得 2023 球季投手投球被擊出的打擊初速相關數據
statcast_pitcher_exitvelo_barrels(2023)
# 獲得 2023 球季投手投球被擊出的打擊初速相關數據 並限制投手至少要達成 100 BBE
statcast_pitcher_exitvelo_barrels(2023, minBBE=100)
想再補充一個,回傳的資料會找不到 BBE 是因為他在取得資料後的欄位會叫 attempts
,其他欄位其實也會跟網頁上的不一樣,但順序會一樣,可以比對一下。然後還有一個跟網頁上的不一樣的是,pybaseball 會預設先依照 BBE 排序 (由大到小),網頁預設則是 Brls/PA% (一個打席擊出 Barrel 的比例,投手會是由小排到大,打者會是由大牌到小)。
Statcast Leaderboard | baseballsavant.com (mlb.com)
跟 statcast_batter_expected_stats
使用同一個頁面獲得各種預期數據,所以參數跟部分回傳欄位會一樣,不過投手會多顯示 xERA
,也就是預期的投手自責分率。回傳資料會依據 pa
打席數由大到小排序,網頁裡的則是 xwOBA
。
https://baseballsavant.mlb.com/leaderboard/expected_statistics?type=pitcher
year
:查詢的球季,必填,需為整數。minPA
:最小打席數,預設是 Qualified ,用 1.25 打席數 * 球隊出賽數計算。from pybaseball import statcast_pitcher_expected_stats
# 獲得 2023 球季的投手被打擊預測數據 + 預期 ERA
statcast_pitcher_expected_stats(2023)
# 獲得 2023 球季的投手被打擊預測數據 + 預期 ERA,但沒有限制打席數
statcast_pitcher_expected_stats(2023, minPA=0)
跟 statcast_batter_percentile_ranks
使用同一個頁面獲得各項進階數據的 PR 值,所以參數跟部分回傳欄位會一樣。不一樣的地方是投手不會有守備跟跑壘 PR,取而代之的是速球球速、速球轉速與曲球轉速。
https://baseballsavant.mlb.com/leaderboard/percentile-rankings?type=pitcher
• year
:查詢的球季,必填,需為整數。
範例:
from pybaseball import statcast_pitcher_percentile_ranks
# 獲得 2023 球季的各項投球數據 PR 值
statcast_pitcher_percentile_ranks(2023)
跟 statcast_batter_pitch_arsenal
使用同一個頁面獲得投手特定球種的表現,例如 Run Value 排名第一的是巨人隊 Logan Webb 的變速球。需要注意一下跟下面接下來要介紹的 statcast_pitcher_pitch_arsenal
是不一樣的東西,請小心不要搞混了。
Statcast Pitch Arsenal Stats | baseballsavant.com (mlb.com)
year
:查詢的球季,必填,需為整數。minPA
:最小打席數,預設是 25 個打席。範例:
from pybaseball import statcast_pitcher_arsenal_stats
# 獲得 2023 球季各打者對決各種球種的數據
statcast_pitcher_arsenal_stats(2023)
# 獲得 2023 球季各打者對決各種球種的數據但沒有限制打席數
statcast_pitcher_arsenal_stats(2023, minPA=0)
雖然跟 statcast_batter_pitch_arsenal
只有 batter
跟 pitcher
的差別,但他們其實是不同頁面的資料。這頁主要是可以直接看到投手各球種的資料,分為平均球速、球種比例和平均轉速,預設會是平均球速。
Statcast Pitch Arsenals Leaderboard | baseballsavant.com (mlb.com)
year
:查詢的球季,必填,需為整數。minP
:最小投球數,預設為 250 球。arsenal_type
:會有三個選項,分別是 avg_speed
平均球速、n_
球種分布、avg_spin
平均轉速。預設是 avg_speed
,如果填其他的會產生錯誤。範例:
from pybaseball import statcast_pitcher_pitch_arsenal
# 獲得 2023 球季各投手的各球種數據,預設種類是平均球速
statcast_pitcher_pitch_arsenal(2023)
# 獲得 2023 球季各投手的各球種數據,限制最小投球數 1000
statcast_pitcher_pitch_arsenal(2023, minP=1000)
# 獲得 2023 球季各投手的各球種數據,種類改成各球種比例
statcast_pitcher_pitch_arsenal(2023, arsenal_type='n_')
各球種的位移資料,可以選特定球種觀看。會有 Vertical Movement
垂直位移和 Horizontal Movement
水平位移等資料。位移量單位為英呎。會用不同球種做分類,如果去他們頁面還可以看到位移分布圖:
Statcast Pitch Movement Leaderboard | baseballsavant.com (mlb.com)
year
:查詢的球季,必填,需為整數。minP
:最小投球數,預設為 Qualified,為 3 * 球隊出賽數的投球數,另外投手需要投到指定球種占總投球數 5 % 才會符合資格。pitch_type
:想查看的球種,能查詢的球種代碼可以參考 這裡。有 FF
四縫線、SIFT
伸卡球、CH
變速球、CUKC
曲球、SL
滑球、FS
快速指叉球、ALL
全球種等。預設是 FF
。2023 新增的 ST
Sweeper 也在裡面。範例:
from pybaseball.statcast_pitcher import statcast_pitcher_pitch_movement
# 獲得 2023 球季各球種的位移數據
statcast_pitcher_pitch_movement(2023)
# 獲得 2023 球季各球種的位移數據,限制最小投球數 1000
statcast_pitcher_pitch_movement(2023, minP=1000)
# 獲得 2023 球季各球種的位移數據,種類改成滑球,預設會是四縫線 FF
statcast_pitcher_pitch_movement(2023, pitch_type="SL")
這邊要注意一下 import 要寫 pybaseball.statcast_pitcher
,因為在 init 檔案裏面沒有 import,然後 官方文件 有錯誤,在這個 Issue 有提到:statcast_pitcher_pitch_movement & statcast_pitcher_active_spin not importing · Issue #382 · jldbc/pybaseball (github.com)
獲得投球 Active Spin (有效旋轉) 相關的資料,簡單的來說產生的旋轉有轉換成球的位移,那就可以稱為有效旋轉。Statcast 使用兩種方法來獲得有效旋轉資料,也可以在這個頁面去選擇不同方法而獲得不同結果,不過目前 pybaseball 只提供 Spin Based
方法。
https://baseballsavant.mlb.com/leaderboard/active-spin
year
:查詢的球季,必填,需為整數。minP
:最小投球數,預設為 250 球。_type
:計算方法,雖然這在 官方文件 沒有提到,但其實可以為 spin-based
和 observed
,如果輸入別的會找不到資料,預設為 spin-based
。另外要注意,2020 之前還沒有 spin-based
方法,所以假設選取 2020 之前且沒有填入這個參數,會自動變成 observed
。範例:
from pybaseball.statcast_pitcher import statcast_pitcher_active_spin
# 獲得 2023 球季的有效旋轉數據
statcast_pitcher_active_spin(2023)
# 獲得 2023 球季的有效旋轉數據,限制最小投球數 1000
statcast_pitcher_active_spin(2023, minP=1000)
# 獲得 2023 球季的有效旋轉數據,計算方法改為 observed
statcast_pitcher_active_spin(2023, _type="observed")
一樣需要注意一下 import。
可以知道兩種不同球種的轉軸,以及有效旋轉率,還有轉軸差異。也能知道不同有效旋轉計算方法下所獲得的轉軸。如果是去頁面看的話還可以看到 Savant 的精美轉軸圖:
Statcast Spin Axis Fastball Comparison | baseballsavant.com (mlb.com)
year
:查詢的球季,必填,需為整數。pitch_a
:第一種想拿來比較的球種,能用的代碼也跟 statcast_pitcher_pitch_movement
一樣可以參考 util.py 裡的設定,預設是 FF
四縫線。pitch_b
:想跟第一種球種比較的第二種球種,能用的代碼也跟 statcast_pitcher_pitch_movement
一樣可以參考 util.py 裡的設定,預設是 CH
變速。minP
:最小投球數,只看第一種球種的投球數,預設是 100。pitcher_pov
:布林值,如果是 True
會是投手視角的轉軸與位移方向,如果是 False
則是打者視角下的方向。範例:
from pybaseball import statcast_pitcher_spin_dir_comp
# 獲得 2023 球季的轉軸相關比較數據
statcast_pitcher_spin_dir_comp(2023)
# 獲得 2023 球季的轉軸相關比較數據,比較四縫線與滑球
statcast_pitcher_spin_dir_comp(2023, pitch_a="FF", pitch_b="SL")
# 獲得 2023 球季的轉軸相關比較數據,改打者視角
statcast_pitcher_spin_dir_comp(2023, pitcher_pov=False)
今天介紹 Statcast 投手相關的 methods,比打者多了滿多東西的,感謝大家耐心地看完。每個頁面其實都有 Savant 提供的小教學或解釋,如果要更深入他們也會附上相關連結,真的很佛心。如果想要更深入了解進階數據或分析,很推薦大家點進去看看。另外還有一個 statcast_pitcher_spin
還沒介紹,不過這個有熱心的人用 statcast_pitcher
去運算的 method,內容挺多的,有機會再跟大家詳細介紹。明天接下來會介紹 Statcast 裡的防守資料。
今天的程式碼:https://colab.research.google.com/drive/1nKsl84nw_4DEGxqN6jvt6OKgNVWXLNh3?usp=sharing